import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex)

export default new Vuex.Store({
  // 全局共享数据
  state: {
    count: 0,
    transList: [],  // 存储所有的事务列表
    inputValue: 'aaa',  // 文本框的内容
    nextId: 5
  },
  // 封装state成新的数据格式
  getters: {
    showNum(state) {
      return '当前最新的数量是【' + state.count + '】'
    },
  },
  // 数据计算
  // 只有mutations才能修改state中的数据
  mutations: {
    add(state) {
      state.count++
    },
    addN(state, step) {
      state.count += step
    },
    sub(state) {
      state.count--
    },
    subN(state, step) {
      state.count -= step
    },
    // 为state中的transList初始化数据
    initTransList(state, data) {
      state.transList = data
    },
    // 为state中的inputValue
    setInputValue(state, value) {
      state.inputValue = value
    },
    // 为state中的transList追加数据
    addTransList(state, value) {
      const obj = { "id": state.nextId, "name": value.trim(), "state": false }
      state.transList.push(obj)
      state.nextId++
    },
    // 根据ID, 删除state中的transList的数据
    removeTransList(state, id) {
      // 查询id所在的索引
      const i = state.transList.findIndex(x => x.id === id)
      // 根据索引删除元素
      if (i != -1) {
        state.transList.splice(i, 1)
      }
    },
    // 根据ID，更改state中的transList的数据
    updateTransList(state, obj) {
      // 查询id所在的索引
      const i = state.transList.findIndex(x => x.id === obj.id)
      // 根据索引修改元素
      if (i != -1) {
        state.transList[i].state = obj.state
      }
    },
    // 删除已完成数据
    removeCompleteTransList(state) {
      const objs = state.transList.filter(list => list.state == true)
      objs.forEach((obj) => {
        this.commit('removeTransList', obj.id)
      })
    }
  },
  // 异步操作
  actions: {
    // 这里的context代指mutations
    // 在actions中不能直接修改state中的数据
    // 需要通过context.commit调用mutations中的方法间接修改
    addAsync(context) {
      setTimeout(() => {
        context.commit('add')
      }, 1000)
    },
    addAsyncN(context, step) {
      setTimeout(() => {
        context.commit('addN', step)
      }, 1000)
    },
    subAsync(context) {
      setTimeout(() => {
        context.commit('sub')
      }, 1000)
    },
    subAsyncN(context, step) {
      setTimeout(() => {
        context.commit('subN', step)
      }, 1000)
    },
    getList(context) {
      return new Promise(resolve => {
        axios.get('/list.json').then(({ data }) => {
          context.commit('initTransList', data)
          resolve();
        })
      })

    }
  },
  modules: {
  }
})
